<?php
/**
 * Facilita la tarea de paginacion de resultados.
 * @author sahib
 */
class DbObjectPaginator extends DbObject {

	/**
	 * Nombre de la tabla
	 * @var string
	 */
	private $table;

	/**
	 * Número de registros por pagina
	 * @var int
	 */
	private $row_limit;

	/**
	 * Inicio del limit, este es calculado automaticamente.
	 * @var int
	 */
	private $limit_start;

	/**
	 * Número de página actual
	 * @var int
	 */
	private $page_num;

	/**
	 * Constructor
	 * 
	 * @param string $page_id formato 'page-1' 1-indexed
	 * @param int $limit registros por pagina
	 * @return DbObjectPaginator
	 */
	public function __construct( $table ) {

		parent::__construct( );
		$this->table = $table;
	}

	/**
	 * Establece la configuración para el paginador.
	 * 
	 * @param int $row_limit registros por pagina
	 * @param string $page_id identificador de la pagina formato: 'page-n'
	 */
	public function config( $row_limit, $page_id ) {

		/*
		 * Solo utilizamos "page-x" para mantener uniformidad
		 * en la URL, en realidad solo nos intereza el número.
		 */
		$page = (int)array_pop( explode( '-', $page_id ) );
		if( $page < 1 )
			$page = 1;
		
		$this->page_num = $page;
		$this->limit_start = $row_limit * ($page - 1);
		$this->row_limit = $row_limit;
	}

	/**
	 * Devuelve el número de paginas totales para la paginación.
	 * 
	 * @return int
	 */
	public function getPagesCount( ) {

		$count = $this->getRowsCount( );
		
		if( $count == 0 )
			return 0;
		else
			return ceil( $count / $this->row_limit );
	}

	/**
	 * Devuelve la lista de registros para la pagina actual, sin reiniciar las query properties
	 * 
	 * @return array
	 */
	public function getPageRows( ) {

		// Evitar el reinicio de las query properties
		$reset = $this->setResetQueryProperties( FALSE );
		
		$rows = $this->setLimit( $this->limit_start, $this->row_limit )
			->select( $this->table );
		
		// Restaurar el reinicio de las query properties
		$this->setResetQueryProperties( $reset );
		return $rows;
	}

	/**
	 * Devuelve el número total de registros para
	 * toda la paginación.
	 * 
	 * @return int
	 */
	public function getRowsCount( ) {

		return $this->selectCount( $this->table );
	}

	/**
	 * Devuelve el número de pagina actual.
	 * 
	 * @return int
	 */
	public function getPageNum( ) {

		return $this->page_num;
	}
}